package main

import (
	"fmt"
	"sync"
)

func worker(id int, ch chan int, wg *sync.WaitGroup) {
	defer wg.Done()

	for {
		// 从channel接收数据
		data, ok := <-ch
		if !ok {
			// channel已关闭
			break
		}
		// 处理接收到的数据
		fmt.Printf("Goroutine %d received: %d\n", id, data)
	}
}

func main() {
	// 创建一个等待组，以便等待所有goroutine完成
	var wg sync.WaitGroup

	// 创建10个channel，每个channel负责接收一部分数据
	channels := make([]chan int, 10)

	for i := 0; i < 10; i++ {
		// 创建一个新的channel
		channels[i] = make(chan int)

		// 启动一个goroutine来处理每个channel
		wg.Add(1)
		go worker(i, channels[i], &wg)
	}

	// 向每个channel发送数据
	for i := 0; i < 100; i++ {
		// 计算应该发送到哪个channel
		channelIndex := i % 10
		// 发送数据到相应的channel
		channels[channelIndex] <- i
	}

	// 关闭所有channel
	for _, ch := range channels {
		close(ch)
	}

	// 等待所有goroutine完成
	wg.Wait()

	fmt.Println("All goroutines completed.")
}
